package thread;
/**
 * 静态方法上如果使用了synchronized，那么该方法一定具有同步效果。
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Boo a1=new Boo();
        Boo b1=new Boo();


       Thread t1=new Thread(){
           public void run(){
             a1.methodA();//静态方法应当:类名.方法() Foo.dosome()
           }
       };

       Thread t2=new Thread(){
           public void run(){
              b1.methodB();//静态方法应当:类名.方法() Foo.dosome()
           }
       };
       t1.start();
       t2.start();


    }

}
class Foo {
   // public static synchronized void dosome(){
   public static   void dosome(){
       synchronized (Foo.class) {
          /*
        如果这里将static去掉会如何?
        此时dosome变成一个成员方法，因此synchronized对应的锁对象就是this。
        那么上面两个线程t1和t2调用时由于:
        t1调用的是f1.dosome()，那么dosome中的this就是f1
        t2调用的是f2.dosome()，那么dosome中的this就是f2
        由于两个线程看到的并非同一个锁对象，因此可以同时执行该该方法。

        static方法则不同，由于该方法全局唯一，因此无论什么时候以何种方式调用
        都能做到同步效果(多个线程分开执行)。
     */
           Thread t = new Thread();
           try {
               System.out.println(t.getName() + "正在执行dosome方法....");
               Thread.sleep(2000);
               System.out.println(t.getName() + "执行完毕!");
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
    }

}


